package com.huawei.codearts.tools.exception;

import com.huawei.codearts.tools.utils.ResultResponse;
import com.huawei.codearts.tools.utils.ResultUtils;
import com.huawei.codearts.tools.validated.StatusEnum;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.HandlerMethodValidationException;

import java.io.IOException;
import java.util.LinkedHashMap;

@RestControllerAdvice
@Order(1)  // 设置处理顺序，数字越小优先级越高
public class ValidExceptionHandler {
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(HandlerMethodValidationException.class)
    public ResultResponse<Object> handleHandlerMethodValidationException(HandlerMethodValidationException ex) throws IOException {
        System.out.println("handleHandlerMethodValidationException... msg: " + ex.getMessage());
        LinkedHashMap<String, Object> errors = new LinkedHashMap<>();  // LinkedHashMap 维护了元素的插入顺序，适合在需要按顺序访问键值对的场景使用。
        ex.getAllErrors().forEach(error -> {
            String fieldName = error instanceof FieldError ? ((FieldError) error).getField() : extractFieldNameFromArguments(error.getArguments());
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        System.out.println("handleHandlerMethodValidationException... errors:" + errors);
        String firstValue = (String) errors.values().iterator().next();
        return ResultUtils.response(StatusEnum.ERROR.code, firstValue, errors);
    }

    private String extractFieldNameFromArguments(Object[] arguments) {
        if (arguments != null) {
            for (Object argument : arguments) {
                if (argument instanceof String) {
                    // 如果arguments数组中包含字段名作为String类型
                    return (String) argument;
                } else if (argument instanceof FieldError) {
                    // 如果arguments数组中包含FieldError实例
                    return ((FieldError) argument).getField();
                }
                // 你可以添加更多检查条件，取决于具体的arguments内容
            }
        }
        return "Unknown Field";  // 如果无法提取字段名，返回默认值
    }
}

